package global

import (
	"database/sql"
	"os"
)

// xls
type (
	XSampSheetName struct {
		Terminal  string `json:"db2s_terminal"`
		Result    string `json:"samp_result"`
		MissTable string `json:"missTable"`
	}
	XSampsheetTatil struct {
		Seq                    string   `json:"任务序号"`
		Schema                 string   `json:"库名"`
		Table                  string   `json:"表名"`
		IndexType              string   `json:"索引类型"`
		IndexCol               []string `json:"索引列"`
		SrcSum                 *int64   `json:"源端表行数"`
		DstSum                 *int64   `json:"目标端行数"`
		SrcSamp                *int64   `json:"源端抽样数"`
		DstSamp                *int64   `json:"目标端抽样数"`
		AbnormalSum            *int64   `json:"异常行数"`
		AbnormalInsert         *int64   `json:"修复insert数量"`
		AbnormalDelete         *int64   `json:"修复delete数量"`
		AbnormalTypeSum        *int64   `json:"差异类型总数"`
		AbnormalTypeProportion string   `json:"数据差异分类/占比"`
		TableCost              string   `json:"单表校验耗时(s)"`
		SampStat               string   `json:"校验状态"` //同步信息，主要记录error信息
		Comment                string   `json:"备注"`   //主要描述错误信息的记录
	}
)
type (
	// Tsamp 终端结果输出表结构
	Tsamp struct {
		Seq             string `json:"seq"`
		Schema          string `json:"schema"`
		Table           string `json:"table"`
		IndexType       string `json:"indexType"`
		IndexCol        string `json:"indexColumn"`
		CheckMode       string `json:"mode"`     //模式
		TableSum        string `json:"tableSum"` //表的实际行数,源端和目标端
		SrcSum          *int64
		DstSum          *int64
		SampSum         string `json:"sampSum"` //源端查询装填
		SrcSamp         *int64
		DstSamp         *int64
		AbnormalSum     *int64 `json:"abnormalSum"`
		AbnormalInsert  *int64
		AbnormalDelete  *int64
		AbnormalTypeSum *int64
		SampStat        string `json:"sampStat"` //同步信息，主要记录error信息
	}
)

type (
	GeneralSql struct {
		DBtype             string
		Schema             string
		Table              string
		IgnoreColumnLength bool     //是否忽略表的字段长度和行长度不匹配问题，true表示忽略
		IndexType          string   //判断索引类型
		IndexColumn        []string //索引列数据
		IndexName          any      //索引名
		LobSwitch          bool     //判断是否是lob，lob使用预处理，非lob采用多value
		Esa                EncryptionProperties
	}
	ApplySql struct {
		DBtype     string
		Schema     string
		Table      string
		DB         map[string]*sql.DB
		LobSwitch  bool
		WriteTextI any
		SqlMode    bool //是否保留sqlmode，true保留，false 清空
		SqlLogBin  bool //是否保留binlog，true保留，false清空
	}
	FixFile struct {
		AbnormalF *os.File
		DeleteF   *os.File
		InsertF   *os.File
		AlterF    *os.File
	}
	Count struct {
		SrcCount        *uint64 `json:"srcCheckCount"`
		DstCount        *uint64 `json:"dstCheckCount"`
		SampCount       *uint64 `json:"sampCount"`
		SampChunk       *uint64 `json:"sampChunk"`
		ChunkSqlSum     *uint64 `json:"chunkSqlSum"`
		TokenBucketRich *uint64 `json:"token_bucket_rich"`
	}
	RandomBucket struct {
		RandomValue map[int64]bool
		TokenBucket chan int64
	}

	SampPlan struct {
		CheckMod     string
		TableSum     map[string]any
		Bucket       RandomBucket
		ApplySql     ApplySql
		GeneralSql   GeneralSql
		FixFile      FixFile
		CheckRows    Count
		UseMetadata  UseTableMetadata
		UseIndexData UseIndex
		//PartitionData Partition
	}
)
